package fr.utbm.tx52.sharing;


import java.util.ArrayList;
import java.util.List;

import fr.utbm.tx52.R;
import fr.utbm.tx52.contactsManagement.Contact;
import fr.utbm.tx52.contactsManagement.ContactList;
import fr.utbm.tx52.dataManagement.DataManager;
import fr.utbm.tx52.reception.MessageType;
import fr.utbm.tx52.reception.PullService;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

/**
 * 
 * Fenêtre d'ajout de commentaires avant le partage d'une photo
 *
 */

public class CommentAdder extends Activity implements OnClickListener {

	/**
	 * Chemin vers le fichier audio que l'on enregistre en commentaire
	 */
	private static final String AUDIO_FILE_NAME =  DataManager.DATA_PATH + "/comment.3gp";
	
	/**
	 * Chemin vers l'image que l'on souhaite partager
	 */
	private String imagePath;
	
	/**
	 * Enregistreur audio
	 */
	private MediaRecorder recorder;
	
	/**
	 * Lecteur audio
	 */
	private MediaPlayer mp = new MediaPlayer();
	
	/**
	 * Y a t il un enregistrement en cours ?
	 */
	private boolean recording;
	
	/**
	 * Bouton de lecture / stop
	 */
	private Button btnPlay;
	
	/**
	 * Bouton d'enregistrement
	 */
	private Button btnRec;
	
	/**
	 * Bouton de selection des contacts de partage
	 */
	private Button btnShareWith;
	
	/**
	 * Bouton de validation de l'envoi
	 */
	private Button btnSend;
	
	/**
	 * Contacts
	 */
	private List<Contact> contactList;
	
	/**
	 * Contacts selectionnés
	 */
	private boolean[] selectedContacts;
	
	/**
	 * Est-ce que la photo est accompagnée d'un commentaire audio ?
	 */
	private boolean hasAudioComment;
	

	
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addcomment);
        
        contactList = ContactList.getAssociatedContactList(this);
        selectedContacts = new boolean[contactList.size()];
        hasAudioComment = false;
        
        // on récupère le chemin vers la photo
        imagePath = getIntent().getStringExtra("photopath");
        Log.d(getClass().getName(), "Chemin vers la photo : " + imagePath);
        
        Bitmap b = BitmapFactory.decodeFile(imagePath);
        if ( b == null ) {
        	Log.d(getClass().getName(), "Impossible de charger la photo !");
        } else {
        	ImageView iv = (ImageView)findViewById(R.id.image_to_share);
        	iv.setImageBitmap(b);
        }
        
        Log.d("add comment", "                  Can read : " + Environment.getExternalStorageDirectory().canRead());
        Log.d("add comment", "                  Can write : " + Environment.getExternalStorageDirectory().canWrite());

        recorder = new MediaRecorder();
        
        recording = false;
        btnPlay = (Button) findViewById(R.id.btn_playstop);
        btnRec = (Button) findViewById(R.id.btn_register);
        btnShareWith = (Button) findViewById(R.id.btn_share_with);
        btnSend = (Button) findViewById(R.id.btn_send);
        
        btnPlay.setOnClickListener(this);
        btnRec.setOnClickListener(this);
        btnShareWith.setOnClickListener(this);
        btnSend.setOnClickListener(this);
        
        btnPlay.setEnabled(false);
        Log.d("on CLick", "                  I'll listen U ------------------------------------------------------------------------");
    }

    
    /**
     * Clique sur l'un des boutons
     */
	public void onClick(View v) {
		Log.d("on CLick", "                  I'm listering to U ------------------------------------------------------------------------");
		
		switch(v.getId()) {
		
		case R.id.btn_register :
			Log.d("on CLick", "                  REC ------------------------------------------------------------------------");
			if ( recording) {
				Log.d("on CLick", "                  REC stop------------------------------------------------------------------------");
				recorder.stop();
				recorder.reset();
				btnPlay.setEnabled(true);
				btnSend.setEnabled(true);
				btnPlay.setText("Lire");
				//recorder.release();
				btnRec.setText("Enregister");
			} else {
				Log.d("on CLick", "                  REC started------------------------------------------------------------------------");
				
		        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
		        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
		        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
		        
		        recorder.setOutputFile(AUDIO_FILE_NAME);
		        try {
		        	btnRec.setText("Enregistrement en cours...\n Cliquez pour arrêter d'enregister");
					recorder.prepare();
				} catch (Exception e) {
					Log.d("add comment", "                  Recorder not ready ------------------------------------------------------------------------");
					e.printStackTrace();
				}
				btnPlay.setEnabled(false);
				btnSend.setEnabled(false);
				hasAudioComment = true;
				recorder.start();
			}
			
			recording = ! recording;
			break;
		
			
		case R.id.btn_playstop :
			Log.d("on CLick", "                  PLAY ------------------------------------------------------------------------");
			
			if (mp.isPlaying()) {
				mp.stop();
				mp.reset();
				btnRec.setEnabled(true);
				btnPlay.setText("Lire");
			} else {
			
				try {
					mp.setDataSource(AUDIO_FILE_NAME);
					mp.prepare();
				} catch (Exception e) {
					Log.d("on CLick", "                  PLAY error------------------------------------------------------------------------");
					e.printStackTrace();
				}
				mp.start();
				btnPlay.setText("Stop");
				btnRec.setEnabled(false);

				mp.setOnCompletionListener(new OnCompletionListener() {
					public void onCompletion(MediaPlayer mp) {
						mp.stop();
						mp.reset();
						btnPlay.setText("Lire");	
					}
				});

				
			}
				
			break;
			
		case R.id.btn_share_with :
			
			final CharSequence[] items = new CharSequence[contactList.size()];
			for (int i=0; i<contactList.size(); ++i) {
				items[i] = contactList.get(i).getName();
			}
			
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setTitle("Selectionner les contacts avec qui vous voulez partager cette photo");
			builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		           }
		       });
			builder.setMultiChoiceItems(items, selectedContacts, new DialogInterface.OnMultiChoiceClickListener() {
				
				public void onClick(DialogInterface dialog, int which, boolean isChecked) {
					selectedContacts[which] = isChecked;
				}
			});

			builder.create().show();
			
			break;
			
		case R.id.btn_send :
			
			List<String> phoneNumberList = new ArrayList<String>();
			boolean atLeastOneContactIsSelected = false;
			for (int i=0; i<contactList.size(); ++i) {
				if (selectedContacts[i]) {
					phoneNumberList.add(contactList.get(i).getPhoneNumber());
					atLeastOneContactIsSelected = true;
				}
			}
			
			if (atLeastOneContactIsSelected) {
				
				btnSend.setEnabled(false);
				
				// envoi photo
				PullService.getInstance().sendFile(imagePath, MessageType.FILE_IMAGE);
				
				// envoi commentaire écrit
				EditText et = (EditText)findViewById(R.id.entry);
				PullService.getInstance().sendMessage(MessageType.COMMENT, et.getText().toString());
				
				// envoi commentaire audio
				if (hasAudioComment) {
					PullService.getInstance().sendFile(AUDIO_FILE_NAME, MessageType.FILE_SOUND);
				}
				
				// enfin l'envoi du message est comme un commit, il signale que l'on a tout envoyé ce qu'on voulait
				PullService.getInstance().sendMessage(MessageType.SHARE_PHOTO, phoneNumberList);
				
				final Activity a = this;
				
				AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
				builder2.setMessage("Votre photo à bien été partagée !")
				       .setCancelable(false)
				       .setPositiveButton("Valider", new DialogInterface.OnClickListener() {
				           public void onClick(DialogInterface dialog, int id) {
				        	   a.finish();
				           }
				       });
				builder2.create().show();
				
			}
			else { // aucun contact selectionné
				AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
				builder2.setMessage("Vous devez sélectionner au moins un contact avec qui partager la photo.")
				       .setCancelable(false)
				       .setPositiveButton("Retour", new DialogInterface.OnClickListener() {
				           public void onClick(DialogInterface dialog, int id) {
				           }
				       });
				builder2.create().show();
			}
			
			break;
			
		}
		
	}

	
}
